home *** CD-ROM | disk | FTP | other *** search
/ BCI NET / BCI NET Dec 94.iso / archives / programming / source / tsm23s.lha / gui.c < prev    next >
C/C++ Source or Header  |  1993-10-08  |  25KB  |  884 lines

  1. // TSMorph - Amiga Morphing program
  2. // Copyright (C) © 1993  Topicsave Limited
  3.  
  4. // This program is free software; you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation; either version 2 of the License, or
  7. // any later version.
  8.  
  9. // This program is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. // GNU General Public License for more details.
  13.  
  14. // You should have received a copy of the GNU General Public License
  15. // along with this program; if not, write to the Free Software
  16. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18. // mpaddock@cix.compulink.co.uk
  19.  
  20. //    $Author: M_J_Paddock $
  21. //    $Date: 1993/09/04 17:43:00 $
  22. //    $Revision: 1.11 $
  23.  
  24. /*
  25.  *  Source machine generated by GadToolsBox V2.0
  26.  *  which is (c) Copyright 1991-1993 Jaba Development
  27.  *
  28.  *  GUI Designed by : M J P
  29.  */
  30.  
  31. // Note! This has had some source code changes after GadToolsBox generation
  32. // including joining sources together, changing/adding gadgets
  33. // and other source code (etc.) !!!!!
  34. // Most changes should have comments attached
  35.  
  36. // include headers if not already done so
  37. #ifndef TSMORPH_H
  38. #include "TSMorph.h"
  39. #endif
  40.  
  41. struct Screen         *Scr = NULL;
  42. UBYTE                 *PubScreenName = NULL;
  43. APTR                   VisualInfo = NULL;
  44. struct Window         *TSMorphWnd = NULL;
  45. struct Gadget         *TSMorphGList = NULL;
  46. struct Menu           *TSMorphMenus = NULL;
  47. struct MenuItem       *TSMorphMenus1 = NULL;
  48. struct IntuiMessage    TSMorphMsg;
  49. UWORD                  TSMorphZoom[4];
  50. struct Gadget         *TSMorphGadgets[17];
  51. extern Class          *initGet( void );
  52. struct IClass         *getClass = NULL;
  53. struct _Object        *getImage = NULL;
  54. UWORD                  TSMorphLeft = 0;
  55. UWORD                  TSMorphTop = 15;
  56. UWORD                  TSMorphWidth = 262;
  57. UWORD                  TSMorphHeight = 169;
  58. UBYTE                 *TSMorphWdt = (UBYTE *)"TSMorph";
  59. struct TextAttr       *Font, Attr;
  60. UWORD                  FontX, FontY;
  61. UWORD                  OffX, OffY;
  62.  
  63. struct Window         *GridRequestWnd = NULL;
  64. struct Gadget         *GridRequestGList = NULL;
  65. struct IntuiMessage    GridRequestMsg;
  66. struct Gadget         *GridRequestGadgets[4];
  67. UWORD                  GridRequestLeft = 246;
  68. UWORD                  GridRequestTop = 21;
  69. UWORD                  GridRequestWidth = 121;
  70. UWORD                  GridRequestHeight = 61;
  71. UBYTE                 *GridRequestWdt = (UBYTE *)"Add Grid";
  72.  
  73. struct Window         *ProgressWnd = NULL;
  74. struct Gadget         *ProgressGList = NULL;
  75. struct IntuiMessage    ProgressMsg;
  76. struct Gadget         *ProgressGadgets[3];
  77. UWORD                  ProgressLeft = 190;
  78. UWORD                  ProgressTop = 42;
  79. UWORD                  ProgressWidth = 311;
  80. UWORD                  ProgressHeight = 57;
  81. UBYTE                 *ProgressWdt = (UBYTE *)"Loading Image";
  82.  
  83. struct NewMenu TSMorphNewMenu[] = {
  84.     NM_TITLE, (STRPTR)"Project", NULL, 0, NULL, NULL,                            // 0
  85.     NM_ITEM, (STRPTR)"New", (STRPTR)"N", 0, 0L, (APTR)TSMorphMenuNew,            // 1
  86.     NM_ITEM, (STRPTR)"Open...", (STRPTR)"O", 0, 0L, (APTR)TSMorphMenuOpen,        // 2
  87.     NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,                            // 3
  88.     NM_ITEM, (STRPTR)"Save", (STRPTR)"S", 0, 0L, (APTR)TSMorphMenuSave,            // 4
  89.     NM_ITEM, (STRPTR)"Save As...", (STRPTR)"A", 0, 0L, (APTR)TSMorphMenuSaveAs,    // 5
  90.     NM_ITEM, (STRPTR)"Delete...", NULL, 0, 0L, (APTR)TSMorphMenuDelete,            // 6
  91.     NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,                            // 7
  92.     NM_ITEM, (STRPTR)"About...", NULL, 0, 0L, (APTR)TSMorphMenuAbout,            // 8
  93.     NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,                            // 9
  94.     NM_ITEM, (STRPTR)"Quit", (STRPTR)"Q", 0, 0L, (APTR)TSMorphMenuQuit,            // 10
  95.     NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,                            // 11
  96.     NM_ITEM, (STRPTR)"Preview...",NULL,0,0L,(APTR)Preview,                        // 12
  97.     NM_ITEM, (STRPTR)"Edit Points", (STRPTR)"E", 0, 0L, (APTR)TSMorphMenuEditPoints,    // 13
  98.     NM_TITLE, (STRPTR)"Settings", NULL, 0, NULL, NULL,                            // 14
  99. // Note this title has no items, these are based on the global settings menu
  100.     NM_END, NULL, NULL, 0, 0L, NULL };
  101.  
  102. UBYTE *SinglePictureLabels[] = {
  103.     (UBYTE *)"Morph",
  104.     (UBYTE *)"Warp",
  105.     (UBYTE *)"AMorph",
  106.     (UBYTE *)"AWarp",
  107.     NULL
  108. };
  109.  
  110. UWORD TSMorphGTypes[] = {
  111.     GENERIC_KIND,
  112.     GENERIC_KIND,
  113.     NUMBER_KIND,
  114.     NUMBER_KIND,
  115.     GENERIC_KIND,
  116.     GENERIC_KIND,
  117.     BUTTON_KIND,
  118.     CYCLE_KIND,
  119.     GENERIC_KIND,
  120.     STRING_KIND,
  121.     STRING_KIND,
  122.     STRING_KIND,
  123.     STRING_KIND,
  124.     INTEGER_KIND,
  125.     INTEGER_KIND,
  126.     STRING_KIND,
  127.     TEXT_KIND,
  128. };
  129.  
  130. struct NewGadget TSMorphNGad[] = {
  131.     239, 57, 20, 14, NULL, NULL, GD_GetFile1, 0, NULL, (APTR)GetFile1Clicked,
  132.     239, 75, 20, 14, NULL, NULL, GD_GetFile2, 0, NULL, (APTR)GetFile2Clicked,
  133.     72, 96, 37, 13, (UBYTE *)"Width", NULL, GD_Width, PLACETEXT_LEFT, NULL, NULL,
  134.     222, 96, 37, 13, (UBYTE *)"Height", NULL, GD_Height, PLACETEXT_LEFT, NULL, NULL,
  135.     239, 21, 20, 14, NULL, NULL, GD_GetFileOne, 0, NULL, (APTR)GetFileOneClicked,
  136.     239, 39, 20, 14, NULL, NULL, GD_GetFileTwo, 0, NULL, (APTR)GetFileTwoClicked,
  137.     2, 150, 257, 15, (UBYTE *)"Edit _Points...", NULL, GD_EditPoints, PLACETEXT_IN, NULL, (APTR)EditPointsClicked,
  138.     2, 114, 80, 14, NULL, NULL, GD_SinglePicture, 0, NULL, (APTR)SinglePictureClicked,
  139.     239, 132, 20, 14, NULL, NULL, GD_GetSaveName, 0, NULL, (APTR)GetSaveNameClicked,
  140.     72, 21, 163, 14, (UBYTE *)"File _One", NULL, GD_FileOne, PLACETEXT_LEFT, NULL, (APTR)FileOneClicked,
  141.     72, 39, 163, 14, (UBYTE *)"File _Two", NULL, GD_FileTwo, PLACETEXT_LEFT, NULL, (APTR)FileTwoClicked,
  142.     72, 57, 163, 14, (UBYTE *)"24 File _1", NULL, GD_File241, PLACETEXT_LEFT, NULL, (APTR)File241Clicked,
  143.     72, 75, 163, 14, (UBYTE *)"24 File _2", NULL, GD_File242, PLACETEXT_LEFT, NULL, (APTR)File242Clicked,
  144.     140, 114, 37, 14, (UBYTE *)"_Frames", NULL, GD_Frames, PLACETEXT_LEFT, NULL, (APTR)FramesClicked,
  145.     230, 114, 29, 14, (UBYTE *)"St_art", NULL, GD_Start, PLACETEXT_LEFT, NULL, (APTR)StartClicked,
  146.     72, 132, 163, 14, (UBYTE *)"_Name", NULL, GD_Name, PLACETEXT_LEFT, NULL, (APTR)NameClicked,
  147.     2, 4, 257, 13,NULL,NULL,GD_Help,0,NULL,NULL,
  148. };
  149.  
  150. ULONG TSMorphGTags[] = {
  151.     (TAG_DONE),
  152.     (TAG_DONE),
  153.     (GTNM_Border), TRUE, (TAG_DONE),
  154.     (GTNM_Border), TRUE, (TAG_DONE),
  155.     (TAG_DONE),
  156.     (TAG_DONE),
  157.     (GT_Underscore), '_', (TAG_DONE),
  158.     (GT_Underscore), '_', (GTCY_Labels), (ULONG)&SinglePictureLabels[0], (TAG_DONE),
  159.     (TAG_DONE),
  160.     (STRINGA_ExitHelp), TRUE, (GTST_MaxChars), 256, (STRINGA_Justification), (GACT_STRINGRIGHT), (GT_Underscore), '_', (TAG_DONE),
  161.     (STRINGA_ExitHelp), TRUE, (GTST_MaxChars), 256, (STRINGA_Justification), (GACT_STRINGRIGHT), (GT_Underscore), '_', (TAG_DONE),
  162.     (STRINGA_ExitHelp), TRUE, (GTST_MaxChars), 256, (STRINGA_Justification), (GACT_STRINGRIGHT), (GT_Underscore), '_', (TAG_DONE),
  163.     (STRINGA_ExitHelp), TRUE, (GTST_MaxChars), 256, (STRINGA_Justification), (GACT_STRINGRIGHT), (GT_Underscore), '_', (TAG_DONE),
  164.     (STRINGA_ExitHelp), TRUE,     (GTIN_Number), 1, (GTIN_MaxChars), 10, (GT_Underscore), '_', (TAG_DONE),
  165.     (STRINGA_ExitHelp), TRUE,     (GTIN_Number), 0, (GTIN_MaxChars), 10, (GT_Underscore), '_', (TAG_DONE),
  166.     (STRINGA_ExitHelp), TRUE,     (GTST_MaxChars), 256, (STRINGA_Justification), (GACT_STRINGRIGHT), (GT_Underscore), '_', (TAG_DONE),
  167.     (GTTX_Border), TRUE, (TAG_DONE),
  168. };
  169.  
  170. UWORD GridRequestGTypes[] = {
  171.     INTEGER_KIND,
  172.     INTEGER_KIND,
  173.     BUTTON_KIND,
  174.     BUTTON_KIND
  175. };
  176.  
  177. struct NewGadget GridRequestNGad[] = {
  178.     76, 5, 40, 14, (UBYTE *)"_X Cells", NULL, GD_XCells, PLACETEXT_LEFT, NULL, (APTR)XCellsClicked,
  179.     76, 23, 40, 14, (UBYTE *)"_Y Cells", NULL, GD_YCells, PLACETEXT_LEFT, NULL, (APTR)YCellsClicked,
  180.     6, 43, 52, 13, (UBYTE *)"_OK", NULL, GD_OK, PLACETEXT_IN, NULL, (APTR)OKClicked,
  181.     64, 43, 52, 13, (UBYTE *)"_Cancel", NULL, GD_Cancel, PLACETEXT_IN, NULL, (APTR)CancelClicked
  182. };
  183.  
  184. ULONG GridRequestGTags[] = {
  185.     (STRINGA_ExitHelp), TRUE, (GTIN_Number), 5, (GTIN_MaxChars), 3, (GT_Underscore), '_', (TAG_DONE),
  186.     (STRINGA_ExitHelp), TRUE, (GTIN_Number), 5, (GTIN_MaxChars), 3, (GT_Underscore), '_', (TAG_DONE),
  187.     (GT_Underscore), '_', (TAG_DONE),
  188.     (GT_Underscore), '_', (TAG_DONE)
  189. };
  190.  
  191. UWORD ProgressGTypes[] = {
  192.     TEXT_KIND,
  193.     SLIDER_KIND,
  194.     SLIDER_KIND
  195. };
  196.  
  197. struct NewGadget ProgressNGad[] = {
  198.     6, 6, 301, 13, NULL, NULL, GD_Mess, 0, NULL, NULL,
  199.     52, 26, 226, 11, (UBYTE *)"Pass", NULL, GD_Pass1, PLACETEXT_LEFT, NULL, NULL,
  200.     52, 43, 226, 11, (UBYTE *)"", NULL, GD_Pass2, PLACETEXT_LEFT, NULL, NULL
  201. };
  202.  
  203. ULONG ProgressGTags[] = {
  204.     (GTTX_Border), TRUE, (TAG_DONE),
  205.     (GTSL_Max), 1, (GTSL_Min), 1, (GTSL_Level), 1, (GTSL_MaxLevelLen), 4, (GTSL_LevelFormat), (ULONG)"%3ld", (GTSL_LevelPlace), (PLACETEXT_RIGHT), (PGA_Freedom), LORIENT_HORIZ, (GA_RelVerify), TRUE, GA_Disabled,TRUE,(TAG_DONE),
  206.     (GTSL_Max), 999, (GTSL_Min), 0, (GTSL_MaxLevelLen), 4, (GTSL_LevelFormat), (ULONG)"%3ld", (GTSL_LevelPlace), (PLACETEXT_RIGHT), (PGA_Freedom), LORIENT_HORIZ, (GA_RelVerify), TRUE, GA_Disabled,TRUE,(TAG_DONE)
  207. };
  208.  
  209.  
  210. struct Rectangle    Rect[17];
  211. struct Rectangle    GRect[4];
  212.  
  213. // The compute font sizing stuff has been changed
  214. static UWORD ComputeX( UWORD value )
  215. {
  216.     return(( UWORD )((( FontX * value ) + 3 ) / 6 ));
  217. }
  218.  
  219. static UWORD ComputeY( UWORD value )
  220. {
  221.     return(( UWORD )((( FontY * value ) + 5 ) / 10 ));
  222. }
  223.  
  224. static void ComputeFont( UWORD width, UWORD height )
  225. {
  226.     Font = &Attr;
  227.     Font->ta_Name = (STRPTR)Scr->RastPort.Font->tf_Message.mn_Node.ln_Name;
  228.     Font->ta_YSize = FontY = Scr->RastPort.Font->tf_YSize;
  229.     FontX = Scr->RastPort.Font->tf_XSize;
  230.  
  231.     OffX = Scr->WBorLeft;
  232.     OffY = Scr->RastPort.TxHeight + Scr->WBorTop + 1;
  233.  
  234.     if ( width && height ) {
  235.         if (( ComputeX( width ) + OffX + Scr->WBorRight ) > Scr->Width )
  236.             goto UseTopaz;
  237.         if (( ComputeY( height ) + OffY + Scr->WBorBottom ) > Scr->Height )
  238.             goto UseTopaz;
  239.     }
  240.     return;
  241.  
  242. UseTopaz:
  243.     Font->ta_Name = (STRPTR)"topaz.font";
  244.     FontX = FontY = Font->ta_YSize = 8;
  245. }
  246.  
  247. int SetupScreen( void )
  248. {
  249.     if ( ! ( Scr = LockPubScreen( PubScreenName )))
  250.         return( 1L );
  251.  
  252. // Is screen low or hires (this check is not really the correct method
  253. // but there does not appear to be a correct method - How does Workbench
  254. // do it? But at least it gets the scroll bars right on lo-res screens,
  255. // unlike MultiView!)
  256.     if (!(Scr->ViewPort.Modes & (HIRES | SUPERHIRES))) {
  257.         n=GS_LOWRES;
  258.     }
  259.        else {
  260.         n=GS_MEDRES;
  261.        }
  262.  
  263.     ComputeFont( 0, 0 );
  264.  
  265.     if ( ! ( VisualInfo = GetVisualInfo( Scr, TAG_DONE )))
  266.         return( 2L );
  267.  
  268.     if ( ! ( getClass = initGet()))
  269.         return( 3L );
  270.  
  271.     if ( ! ( getImage = NewObject( getClass, NULL, GT_VisualInfo, VisualInfo, TAG_DONE )))
  272.         return( 4L );
  273.  
  274.     return( 0L );
  275. }
  276.  
  277. void CloseDownScreen( void )
  278. {
  279.     if ( getImage   ) {
  280.         DisposeObject( getImage );
  281.         getImage = NULL;
  282.     }
  283.  
  284.     if ( getClass   ) {
  285.         FreeClass( getClass );
  286.         getClass = NULL;
  287.     }
  288.  
  289.     if ( VisualInfo ) {
  290.         FreeVisualInfo( VisualInfo );
  291.         VisualInfo = NULL;
  292.     }
  293.  
  294.     if ( Scr        ) {
  295.         UnlockPubScreen( NULL, Scr );
  296.         Scr = NULL;
  297.     }
  298. }
  299.  
  300. int HandleTSMorphIDCMP( void )
  301. {
  302.     struct IntuiMessage    *m;
  303.     struct MenuItem        *n;
  304.     int            (*func)(void);
  305.     BOOL            running = TRUE;
  306.     ULONG HNum;
  307.  
  308.     while( m = GT_GetIMsg( TSMorphWnd->UserPort )) {
  309.  
  310.         CopyMem(( char * )m, ( char * )&TSMorphMsg, (long)sizeof( struct IntuiMessage ));
  311.  
  312.         GT_ReplyIMsg( m );
  313.  
  314.         switch ( TSMorphMsg.Class ) {
  315.  
  316.             case    IDCMP_REFRESHWINDOW:
  317.                 GT_BeginRefresh( TSMorphWnd );
  318.                 GT_EndRefresh( TSMorphWnd, TRUE );
  319.                 break;
  320.  
  321.             case    IDCMP_CLOSEWINDOW:
  322.                 running = TSMorphCloseWindow();
  323.                 break;
  324.  
  325.             case    IDCMP_MENUHELP:
  326.                 running = TSMorphMenuHelp();
  327.                 break;
  328.  
  329.             case    IDCMP_VANILLAKEY:
  330.                 running = TSMorphVanillaKey();
  331.                 break;
  332.  
  333.             case    IDCMP_RAWKEY:
  334.                 running = TSMorphRawKey();
  335.                 break;
  336.  
  337.             case    IDCMP_GADGETUP:
  338.                 func = ( void * )(( struct Gadget * )TSMorphMsg.IAddress )->UserData;
  339.                 running = func();
  340.                 break;
  341.  
  342. // special case - settings use no GadToolsBox method
  343.             case    IDCMP_MENUPICK:
  344.                 while( TSMorphMsg.Code != MENUNULL ) {
  345.                     n = ItemAddress( TSMorphMenus, TSMorphMsg.Code );
  346.                     if (func = (void *)(GTMENUITEM_USERDATA( n ))) {
  347.                         running = func();
  348.                     }
  349.                     else {
  350.                         HandleSettings(TSMorphMsg.Code,NULL);
  351.                     }
  352.                     TSMorphMsg.Code = n->NextSelect;
  353.                 }
  354.                 break;
  355.  
  356. // special case GadgetHelp
  357. // see the amigaguide distribution for some of how
  358. // this stuff works (i.e. do not ask me, I am not a developer)
  359.             case    IDCMP_GADGETHELP:
  360.                  if (TSMorphMsg.IAddress == NULL) {
  361.                      HNum = 0;
  362.                  }
  363.                  else {
  364.                      if (TSMorphMsg.IAddress == TSMorphWnd) {
  365.                          HNum = H_IWindow;
  366.                      }
  367.                      else {
  368.                          switch (((struct Gadget *)TSMorphMsg.IAddress)->GadgetType &0xf0) {
  369.                          case GTYP_WDRAGGING:
  370.                              HNum = H_IWindow;
  371.                              break;
  372.                          case GTYP_WUPFRONT:
  373.                              HNum = H_IDepth;
  374.                              break;
  375.                          case GTYP_WDOWNBACK:
  376.                              HNum = H_IZoom;
  377.                              break;
  378.                          case GTYP_CLOSE:
  379.                              HNum = H_IClose;
  380.                              break;
  381.                          case 0:
  382.                              switch (((struct Gadget *)TSMorphMsg.IAddress)->GadgetID) {
  383.                              case GD_Help:
  384.                                  HNum = H_HelpGad;
  385.                                  break;
  386.                              case GD_GetFile1:
  387.                                  HNum = H_G24File1;
  388.                                  break;
  389.                              case GD_GetFile2:
  390.                                  HNum = H_G24File2;
  391.                                  break;
  392.                              case GD_Width:
  393.                                  HNum = H_Width;
  394.                                  break;
  395.                              case GD_Height:
  396.                                  HNum = H_Height;
  397.                                  break;
  398.                              case GD_GetFileOne:
  399.                                  HNum = H_GFileOne;
  400.                                  break;
  401.                              case GD_GetFileTwo:
  402.                                  HNum = H_GFileTwo;
  403.                                  break;
  404.                              case GD_EditPoints:
  405.                                  HNum = H_EPoints;
  406.                                  break;
  407.                              case GD_SinglePicture:
  408.                                  HNum = H_Single;
  409.                                  break;
  410.                              case GD_GetSaveName:
  411.                                  HNum = H_GName;
  412.                                  break;
  413.                              case GD_FileOne:
  414.                                  HNum = H_FileOne;
  415.                                  break;
  416.                              case GD_FileTwo:
  417.                                  HNum = H_FileTwo;
  418.                                  break;
  419.                              case GD_File241:
  420.                                  HNum = H_24File1;
  421.                                  break;
  422.                              case GD_File242:
  423.                                  HNum = H_24File2;
  424.                                  break;
  425.                              case GD_Frames:
  426.                                  HNum = H_Frames;
  427.                                  break;
  428.                              case GD_Start:
  429.                                  HNum = H_Start;
  430.                                  break;
  431.                              case GD_Name:
  432.                                  HNum = H_Name;
  433.                                  break;
  434.                              default:
  435.                                  HNum = H_IWindow;
  436.                                  break;
  437.                              }
  438.                              break;
  439.                          default:
  440.                              HNum = H_IWindow;
  441.                              break;
  442.                          }
  443.                      }
  444.                  }
  445.                  if (HNum) {
  446.                      // display full or short help
  447.                      if (GHelp) {
  448.                          help(HNum);
  449.                      }
  450.                      else {
  451.                          ihelp(HNum);
  452.                      }
  453.                  }
  454.                 break;
  455.         }
  456.     }
  457.     return( (int) running );
  458. }
  459.  
  460. int OpenTSMorphWindow( void )
  461. {
  462.     struct NewGadget    ng;
  463.     struct Gadget    *g;
  464.     UWORD        lc, tc;
  465.     UWORD        wleft = TSMorphLeft, wtop, ww, wh;
  466.  
  467.     TSMorphTop = Scr->BarHeight + 1;
  468.     wtop = TSMorphTop;
  469.     ComputeFont( TSMorphWidth, TSMorphHeight );
  470.  
  471.     ww = ComputeX( TSMorphWidth );
  472.     wh = ComputeY( TSMorphHeight );
  473.  
  474.     if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
  475.     if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;
  476.  
  477.     if ( ! ( g = CreateContext( &TSMorphGList )))
  478.         return( 1L );
  479.  
  480.  
  481. // If no reqtools then no animated morphs (so remove from cycle gadget)
  482. // purely because we need the Frame requester
  483.     if (!ReqToolsBase) {
  484.         SinglePictureLabels[2] = NULL;
  485.     }
  486.  
  487.     for( lc = 0, tc = 0; lc < TSMorph_CNT; lc++ ) {
  488.  
  489.         CopyMem((char * )&TSMorphNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));
  490.  
  491.         ng.ng_VisualInfo = VisualInfo;
  492.         ng.ng_TextAttr   = Font;
  493.         ng.ng_LeftEdge   = OffX + ComputeX( ng.ng_LeftEdge );
  494.         ng.ng_TopEdge    = OffY + ComputeY( ng.ng_TopEdge );
  495.  
  496.         if ( TSMorphGTypes[ lc ] != GENERIC_KIND ) {
  497.             ng.ng_Width      = ComputeX( ng.ng_Width );
  498.             ng.ng_Height     = ComputeY( ng.ng_Height);
  499.         }
  500.  
  501. // Save gadget position/size for help key
  502.         Rect[lc].MinX = ng.ng_LeftEdge;
  503.         Rect[lc].MinY = ng.ng_TopEdge;
  504.         Rect[lc].MaxX = ng.ng_LeftEdge + ng.ng_Width;
  505.         Rect[lc].MaxY = ng.ng_TopEdge + ng.ng_Height;
  506.  
  507.         TSMorphGadgets[ lc ] = g = CreateGadgetA((ULONG)TSMorphGTypes[ lc ], g, &ng, ( struct TagItem * )&TSMorphGTags[ tc ] );
  508.  
  509.         if ( TSMorphGTypes[ lc ] == GENERIC_KIND ) {
  510.             g->Flags             |= GFLG_GADGIMAGE | GFLG_GADGHIMAGE;
  511.             g->Activation        |= GACT_RELVERIFY;
  512.             g->GadgetRender       = (APTR)getImage;
  513.             g->SelectRender       = (APTR)getImage;
  514.         }
  515.  
  516.         while( TSMorphGTags[ tc ] ) tc += 2;
  517.         tc++;
  518.  
  519.         if ( NOT g )
  520.             return( 2L );
  521.     }
  522.  
  523. // update menus based on current settings
  524.     UpdateMenuDefs();
  525.  
  526. // non standard stuff, the settings menu is set up based on the global settings menu items
  527.     if ( ! ( TSMorphMenus = CreateMenus( TSMorphNewMenu, TAG_DONE )))
  528.         return( 3L );
  529.  
  530.     if ( ! ( TSMorphMenus1 = (struct MenuItem *)CreateMenus( &(MyNewMenu[NM_CREATEICONS]) , TAG_DONE )))
  531.         return( 3L );
  532.  
  533.     LayoutMenus( TSMorphMenus, VisualInfo, 
  534.                 GTMN_NewLookMenus,TRUE,
  535.                 TAG_DONE );
  536.  
  537.     TSMorphMenus->NextMenu->FirstItem = TSMorphMenus1;
  538.  
  539.     LayoutMenuItems(TSMorphMenus1, VisualInfo,
  540.                 GTMN_Menu,TSMorphMenus->NextMenu,
  541.                 GTMN_NewLookMenus,TRUE,
  542.                 TAG_DONE );
  543.  
  544.     TSMorphZoom[0] = TSMorphZoom[1] = 0;
  545.     TSMorphZoom[2]  = ww + OffX + Scr->WBorRight;
  546.     TSMorphZoom[3] = Rect[GDX_Help].MaxY + Scr->WBorBottom + 2;
  547. #define GADGETUP IDCMP_GADGETUP
  548. // This is used in the 2.02 versions of BUTTONIDCMP etc.
  549. // But is not defined as IOBSOLETE stuff is not included
  550.     if ( ! ( TSMorphWnd = OpenWindowTags( NULL,
  551.                 WA_Left,    wleft,
  552.                 WA_Top,        wtop,
  553.                 WA_Width,    ww + OffX + Scr->WBorRight,
  554.                 WA_Height,    wh + OffY + Scr->WBorBottom,
  555.                 WA_IDCMP,    IDCMP_GADGETUP|NUMBERIDCMP|BUTTONIDCMP|CHECKBOXIDCMP|STRINGIDCMP|
  556.                             INTEGERIDCMP|IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_RAWKEY|IDCMP_VANILLAKEY|
  557.                             IDCMP_MENUHELP|IDCMP_REFRESHWINDOW|IDCMP_GADGETHELP|IDCMP_MOUSEMOVE,
  558.                 WA_Flags,    WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH,
  559.                 WA_Gadgets,    TSMorphGList,
  560.                 WA_Title,    TSMorphWdt,
  561.                 WA_ScreenTitle,    "TSMorph ©1993 Topicsave Limited",
  562.                 WA_PubScreen,    Scr,
  563.                 WA_Zoom,    TSMorphZoom,
  564.                 WA_AutoAdjust,    TRUE,
  565.                 WA_PubScreenFallBack,    TRUE,
  566.                 WA_MenuHelp,    TRUE,
  567.                 WA_NewLookMenus,TRUE,
  568.                 TAG_DONE )))
  569.     return( 4L );
  570.  
  571. // switch on gadget help if release 3.0+
  572.     if (IntuitionBase->lib_Version > 38) {
  573.         HelpControl(TSMorphWnd,HC_GADGETHELP);
  574.     }
  575.  
  576.     SetMenuStrip( TSMorphWnd, TSMorphMenus );
  577.     GT_RefreshWindow( TSMorphWnd, NULL );
  578.  
  579.     return( 0L );
  580. }
  581.  
  582. void CloseTSMorphWindow( void )
  583. {
  584. // Free menus - not entirely sure if need (or should) do in two bits
  585.     if ( TSMorphMenus      ) {
  586.         if (TSMorphWnd) {
  587.             ClearMenuStrip( TSMorphWnd );
  588.         }
  589.         TSMorphMenus->NextMenu->FirstItem = NULL;
  590.         FreeMenus( TSMorphMenus );
  591.         TSMorphMenus = NULL;
  592.     }
  593.  
  594.     if (TSMorphMenus1) {
  595.         FreeMenus( (struct Menu *)TSMorphMenus1 );
  596.         TSMorphMenus1 = NULL;
  597.     }
  598.  
  599.     if ( TSMorphWnd        ) {
  600.         CloseWindow( TSMorphWnd );
  601.         TSMorphWnd = NULL;
  602.     }
  603.  
  604.     if ( TSMorphGList      ) {
  605.         FreeGadgets( TSMorphGList );
  606.         TSMorphGList = NULL;
  607.     }
  608. }
  609.  
  610. int HandleGridRequestIDCMP( void )
  611. {
  612.     struct IntuiMessage    *m;
  613.     int            (*func)(void);
  614.     BOOL            running = TRUE;
  615.     ULONG HNum;
  616.  
  617.     while( m = GT_GetIMsg( GridRequestWnd->UserPort )) {
  618.  
  619.         CopyMem(( char * )m, ( char * )&GridRequestMsg, (long)sizeof( struct IntuiMessage ));
  620.  
  621.         GT_ReplyIMsg( m );
  622.  
  623.         switch ( GridRequestMsg.Class ) {
  624.  
  625.             case    IDCMP_REFRESHWINDOW:
  626.                 GT_BeginRefresh( GridRequestWnd );
  627.                 GT_EndRefresh( GridRequestWnd, TRUE );
  628.                 break;
  629.  
  630.             case    IDCMP_CLOSEWINDOW:
  631.                 running = GridRequestCloseWindow();
  632.                 break;
  633.  
  634.             case    IDCMP_VANILLAKEY:
  635.                 running = GridRequestVanillaKey();
  636.                 break;
  637.  
  638.             case    IDCMP_RAWKEY:
  639.                 running = GridRequestRawKey();
  640.                 break;
  641.  
  642.             case    IDCMP_GADGETUP:
  643.                 func = ( void * )(( struct Gadget * )GridRequestMsg.IAddress )->UserData;
  644.                 running = func();
  645.                 break;
  646.  
  647. // gadgethelp - see above
  648.             case    IDCMP_GADGETHELP:
  649.                  if (GridRequestMsg.IAddress == NULL) {
  650.                      HNum = 0;
  651.                  }
  652.                  else {
  653.                      if (GridRequestMsg.IAddress == GridRequestWnd) {
  654.                          HNum = H_RAG;
  655.                      }
  656.                      else {
  657.                          switch (((struct Gadget *)GridRequestMsg.IAddress)->GadgetType &0xf0) {
  658.                          case GTYP_WDRAGGING:
  659.                              HNum = H_RAG;
  660.                              break;
  661.                          case GTYP_WUPFRONT:
  662.                              HNum = H_RAGGDE;
  663.                              break;
  664.                          case GTYP_CLOSE:
  665.                              HNum = H_RAGGCL;
  666.                              break;
  667.                          case 0:
  668.                              switch (((struct Gadget *)GridRequestMsg.IAddress)->GadgetID) {
  669.                              case GD_XCells:
  670.                                  HNum = H_RAGGX;
  671.                                  break;
  672.                              case GD_YCells:
  673.                                  HNum = H_RAGGY;
  674.                                  break;
  675.                              case GD_OK:
  676.                                  HNum = H_RAGGOK;
  677.                                  break;
  678.                              case GD_Cancel:
  679.                                  HNum = H_RAGGCA;
  680.                                  break;
  681.                              default:
  682.                                  HNum = H_RAG;
  683.                                  break;
  684.                              }
  685.                              break;
  686.                          default:
  687.                              HNum = H_RAG;
  688.                              break;
  689.                          }
  690.                      }
  691.                  }
  692.                  if (HNum) {
  693.                      if (GHelp) {
  694.                          help(HNum);
  695.                      }
  696.                      else {
  697.                          ihelp(HNum);
  698.                      }
  699.                  }
  700.                 break;
  701.         }
  702.     }
  703.     return( (int) running );
  704. }
  705.  
  706. int OpenGridRequestWindow( void )
  707. {
  708.     struct NewGadget    ng;
  709.     struct Gadget    *g;
  710.     UWORD        lc, tc;
  711.     UWORD        wleft = GridRequestLeft, wtop = GridRequestTop, ww, wh;
  712.  
  713.     ComputeFont( GridRequestWidth, GridRequestHeight );
  714.  
  715.     ww = ComputeX( GridRequestWidth );
  716.     wh = ComputeY( GridRequestHeight );
  717.  
  718.     if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
  719.     if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;
  720.  
  721.     if ( ! ( g = CreateContext( &GridRequestGList )))
  722.         return( 1L );
  723.  
  724.     for( lc = 0, tc = 0; lc < GridRequest_CNT; lc++ ) {
  725.  
  726.         CopyMem((char * )&GridRequestNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));
  727.  
  728.         ng.ng_VisualInfo = VisualInfo;
  729.         ng.ng_TextAttr   = Font;
  730.         ng.ng_LeftEdge   = OffX + ComputeX( ng.ng_LeftEdge );
  731.         ng.ng_TopEdge    = OffY + ComputeY( ng.ng_TopEdge );
  732.         ng.ng_Width      = ComputeX( ng.ng_Width );
  733.         ng.ng_Height     = ComputeY( ng.ng_Height);
  734.  
  735. // save position and size for help key
  736.         GRect[lc].MinX = ng.ng_LeftEdge;
  737.         GRect[lc].MinY = ng.ng_TopEdge;
  738.         GRect[lc].MaxX = ng.ng_LeftEdge + ng.ng_Width;
  739.         GRect[lc].MaxY = ng.ng_TopEdge + ng.ng_Height;
  740.  
  741.         GridRequestGadgets[ lc ] = g = CreateGadgetA((ULONG)GridRequestGTypes[ lc ], g, &ng, ( struct TagItem * )&GridRequestGTags[ tc ] );
  742.  
  743.         while( GridRequestGTags[ tc ] ) tc += 2;
  744.         tc++;
  745.  
  746.         if ( NOT g )
  747.             return( 2L );
  748.     }
  749.  
  750.     if ( ! ( GridRequestWnd = OpenWindowTags( NULL,
  751.                 WA_Left,    wleft,
  752.                 WA_Top,        wtop,
  753.                 WA_Width,    ww + OffX + Scr->WBorRight,
  754.                 WA_Height,    wh + OffY + Scr->WBorBottom,
  755.                 WA_IDCMP,    INTEGERIDCMP|BUTTONIDCMP|IDCMP_CLOSEWINDOW|IDCMP_RAWKEY|IDCMP_VANILLAKEY|
  756.                             IDCMP_REFRESHWINDOW|IDCMP_GADGETHELP|IDCMP_MOUSEMOVE,
  757.                 WA_Flags,    WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
  758.                 WA_Gadgets,    GridRequestGList,
  759.                 WA_Title,    GridRequestWdt,
  760.                 WA_ScreenTitle,    "TSMorph",
  761.                 WA_PubScreen,    Scr,
  762.                 WA_AutoAdjust,    TRUE,
  763.                 TAG_DONE )))
  764.     return( 4L );
  765.  
  766. // switch on help control if release 3.0+
  767.     if (IntuitionBase->lib_Version > 38) {
  768.         HelpControl(GridRequestWnd,HC_GADGETHELP);
  769.     }
  770.  
  771.     GT_RefreshWindow( GridRequestWnd, NULL );
  772.  
  773.     return( 0L );
  774. }
  775.  
  776. void CloseGridRequestWindow( void )
  777. {
  778.     if ( GridRequestWnd        ) {
  779.         CloseWindow( GridRequestWnd );
  780.         GridRequestWnd = NULL;
  781.     }
  782.  
  783.     if ( GridRequestGList      ) {
  784.         FreeGadgets( GridRequestGList );
  785.         GridRequestGList = NULL;
  786.     }
  787. }
  788.  
  789. int HandleProgressIDCMP( void )
  790. {
  791.     struct IntuiMessage    *m;
  792.     BOOL            running = TRUE;
  793.  
  794.     while( m = GT_GetIMsg( ProgressWnd->UserPort )) {
  795.  
  796.         CopyMem(( char * )m, ( char * )&ProgressMsg, (long)sizeof( struct IntuiMessage ));
  797.  
  798.         GT_ReplyIMsg( m );
  799.  
  800.         switch ( ProgressMsg.Class ) {
  801.  
  802.             case    IDCMP_REFRESHWINDOW:
  803.                 GT_BeginRefresh( ProgressWnd );
  804.                 GT_EndRefresh( ProgressWnd, TRUE );
  805.                 break;
  806.  
  807.         }
  808.     }
  809.     return( (int) running );
  810. }
  811.  
  812. int OpenProgressWindow( void )
  813. {
  814.     struct NewGadget    ng;
  815.     struct Gadget    *g;
  816.     UWORD        lc, tc;
  817.     UWORD        wleft = ProgressLeft, wtop = ProgressTop, ww, wh;
  818.  
  819.     ComputeFont( ProgressWidth, ProgressHeight );
  820.  
  821.     ww = ComputeX( ProgressWidth );
  822.     wh = ComputeY( ProgressHeight );
  823.  
  824.     if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
  825.     if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;
  826.  
  827.     if ( ! ( g = CreateContext( &ProgressGList )))
  828.         return( 1L );
  829.  
  830.     for( lc = 0, tc = 0; lc < Progress_CNT; lc++ ) {
  831.  
  832.         CopyMem((char * )&ProgressNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));
  833.  
  834.         ng.ng_VisualInfo = VisualInfo;
  835.         ng.ng_TextAttr   = Font;
  836.         ng.ng_LeftEdge   = OffX + ComputeX( ng.ng_LeftEdge );
  837.         ng.ng_TopEdge    = OffY + ComputeY( ng.ng_TopEdge );
  838.         ng.ng_Width      = ComputeX( ng.ng_Width );
  839.         ng.ng_Height     = ComputeY( ng.ng_Height);
  840.  
  841.         ProgressGadgets[ lc ] = g = CreateGadgetA((ULONG)ProgressGTypes[ lc ], g, &ng, ( struct TagItem * )&ProgressGTags[ tc ] );
  842.  
  843.         while( ProgressGTags[ tc ] ) tc += 2;
  844.         tc++;
  845.  
  846.         if ( NOT g )
  847.             return( 2L );
  848.     }
  849.  
  850.     if ( ! ( ProgressWnd = OpenWindowTags( NULL,
  851.                 WA_Left,    wleft,
  852.                 WA_Top,        wtop,
  853.                 WA_Width,    ww + OffX + Scr->WBorRight,
  854.                 WA_Height,    wh + OffY + Scr->WBorBottom,
  855.                 WA_IDCMP,    TEXTIDCMP|IDCMP_REFRESHWINDOW,
  856.                 WA_Flags,    WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH,
  857.                 WA_Gadgets,    ProgressGList,
  858.                 WA_Title,    ProgressWdt,
  859.                 WA_ScreenTitle,    "TSMorph ©1993 Topicsave Limited",
  860.                 WA_PubScreen,    Scr,
  861.                 TAG_DONE )))
  862.     return( 4L );
  863.  
  864. // Wait pointer
  865.     SetPointer(ProgressWnd, BusyPointerData, 16, 16, -6, 0);
  866.     GT_RefreshWindow( ProgressWnd, NULL );
  867.  
  868.     return( 0L );
  869. }
  870.  
  871. void CloseProgressWindow( void )
  872. {
  873.     if ( ProgressWnd        ) {
  874.         CloseWindow( ProgressWnd );
  875.         ProgressWnd = NULL;
  876.     }
  877.  
  878.     if ( ProgressGList      ) {
  879.         FreeGadgets( ProgressGList );
  880.         ProgressGList = NULL;
  881.     }
  882. }
  883.  
  884.